#pragma once

#include "ipc/sem.h"
#include "dev/dev.h"
#include "ipc/sem.h"

#define TTY_NR						8		// 最大支持的tty设备数量
#define TTY_IBUF_SIZE				512		// tty输入缓存大小
#define TTY_OBUF_SIZE				512		// tty输出缓存大小

#define TTY_OCRLF			(1 << 0)		// 输出是否将\n转换成\r\n

#define TTY_INLCR			(1 << 0)		// 将\n转成\r\n
#define TTY_IECHO			(1 << 2)		// 是否回显

#define TTY_CMD_ECHO        0x1


typedef struct _tty_fifo_t 
{
	char * buf;
	int size;				// 最大字节数
	int read, write;		// 当前读写位置
	int count;				// 当前已有的数据量
}tty_fifo_t;


typedef struct _tty_t 
{
	char obuf[TTY_OBUF_SIZE];
	tty_fifo_t ofifo;				// 输出队列
	sem_t osem;						// 输出队列信号量
	sem_t isem;						// 输入队列信号量
	char ibuf[TTY_IBUF_SIZE];
	tty_fifo_t ififo;				// 输入处理后的队列

    int oflags;						// 输出标志
    int iflags;						// 输入标志
	int console_idx;				// 控制台索引号
}tty_t;


int tty_open (device_t * dev);

//从tty读取数据
int tty_read (device_t * dev, int addr, char * buf, int size);

//向tty写入数据
int tty_write (device_t * dev, int addr, char * buf, int size);


//向tty设备发送命令
int tty_control (device_t * dev, int cmd, int arg0, int arg1);


//关闭tty设备
void tty_close (device_t * dev);

void tty_fifo_init (tty_fifo_t * fifo, char * buf, int size);
int tty_fifo_get (tty_fifo_t * fifo, char * c);

void tty_select(int tty);
void tty_in (char ch);